/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.jpa.controllers;

import co.com.ces4.produccion.jpa.controllers.exceptions.IllegalOrphanException;
import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.entities.MateriaPrima;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import co.com.ces4.produccion.jpa.entities.MateriaPrimaArticulo;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author usuario
 */
public class MateriaPrimaJpaController implements Serializable {

    public MateriaPrimaJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(MateriaPrima materiaPrima) {
        if (materiaPrima.getMateriaPrimaArticuloList() == null) {
            materiaPrima.setMateriaPrimaArticuloList(new ArrayList<MateriaPrimaArticulo>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<MateriaPrimaArticulo> attachedMateriaPrimaArticuloList = new ArrayList<MateriaPrimaArticulo>();
            for (MateriaPrimaArticulo materiaPrimaArticuloListMateriaPrimaArticuloToAttach : materiaPrima.getMateriaPrimaArticuloList()) {
                materiaPrimaArticuloListMateriaPrimaArticuloToAttach = em.getReference(materiaPrimaArticuloListMateriaPrimaArticuloToAttach.getClass(), materiaPrimaArticuloListMateriaPrimaArticuloToAttach.getMateriaPrimaArticuloPK());
                attachedMateriaPrimaArticuloList.add(materiaPrimaArticuloListMateriaPrimaArticuloToAttach);
            }
            materiaPrima.setMateriaPrimaArticuloList(attachedMateriaPrimaArticuloList);
            em.persist(materiaPrima);
            for (MateriaPrimaArticulo materiaPrimaArticuloListMateriaPrimaArticulo : materiaPrima.getMateriaPrimaArticuloList()) {
                MateriaPrima oldMateriaPrimaOfMateriaPrimaArticuloListMateriaPrimaArticulo = materiaPrimaArticuloListMateriaPrimaArticulo.getMateriaPrima();
                materiaPrimaArticuloListMateriaPrimaArticulo.setMateriaPrima(materiaPrima);
                materiaPrimaArticuloListMateriaPrimaArticulo = em.merge(materiaPrimaArticuloListMateriaPrimaArticulo);
                if (oldMateriaPrimaOfMateriaPrimaArticuloListMateriaPrimaArticulo != null) {
                    oldMateriaPrimaOfMateriaPrimaArticuloListMateriaPrimaArticulo.getMateriaPrimaArticuloList().remove(materiaPrimaArticuloListMateriaPrimaArticulo);
                    oldMateriaPrimaOfMateriaPrimaArticuloListMateriaPrimaArticulo = em.merge(oldMateriaPrimaOfMateriaPrimaArticuloListMateriaPrimaArticulo);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(MateriaPrima materiaPrima) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            MateriaPrima persistentMateriaPrima = em.find(MateriaPrima.class, materiaPrima.getNmid());
            List<MateriaPrimaArticulo> materiaPrimaArticuloListOld = persistentMateriaPrima.getMateriaPrimaArticuloList();
            List<MateriaPrimaArticulo> materiaPrimaArticuloListNew = materiaPrima.getMateriaPrimaArticuloList();
            List<String> illegalOrphanMessages = null;
            for (MateriaPrimaArticulo materiaPrimaArticuloListOldMateriaPrimaArticulo : materiaPrimaArticuloListOld) {
                if (!materiaPrimaArticuloListNew.contains(materiaPrimaArticuloListOldMateriaPrimaArticulo)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain MateriaPrimaArticulo " + materiaPrimaArticuloListOldMateriaPrimaArticulo + " since its materiaPrima field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<MateriaPrimaArticulo> attachedMateriaPrimaArticuloListNew = new ArrayList<MateriaPrimaArticulo>();
            for (MateriaPrimaArticulo materiaPrimaArticuloListNewMateriaPrimaArticuloToAttach : materiaPrimaArticuloListNew) {
                materiaPrimaArticuloListNewMateriaPrimaArticuloToAttach = em.getReference(materiaPrimaArticuloListNewMateriaPrimaArticuloToAttach.getClass(), materiaPrimaArticuloListNewMateriaPrimaArticuloToAttach.getMateriaPrimaArticuloPK());
                attachedMateriaPrimaArticuloListNew.add(materiaPrimaArticuloListNewMateriaPrimaArticuloToAttach);
            }
            materiaPrimaArticuloListNew = attachedMateriaPrimaArticuloListNew;
            materiaPrima.setMateriaPrimaArticuloList(materiaPrimaArticuloListNew);
            materiaPrima = em.merge(materiaPrima);
            for (MateriaPrimaArticulo materiaPrimaArticuloListNewMateriaPrimaArticulo : materiaPrimaArticuloListNew) {
                if (!materiaPrimaArticuloListOld.contains(materiaPrimaArticuloListNewMateriaPrimaArticulo)) {
                    MateriaPrima oldMateriaPrimaOfMateriaPrimaArticuloListNewMateriaPrimaArticulo = materiaPrimaArticuloListNewMateriaPrimaArticulo.getMateriaPrima();
                    materiaPrimaArticuloListNewMateriaPrimaArticulo.setMateriaPrima(materiaPrima);
                    materiaPrimaArticuloListNewMateriaPrimaArticulo = em.merge(materiaPrimaArticuloListNewMateriaPrimaArticulo);
                    if (oldMateriaPrimaOfMateriaPrimaArticuloListNewMateriaPrimaArticulo != null && !oldMateriaPrimaOfMateriaPrimaArticuloListNewMateriaPrimaArticulo.equals(materiaPrima)) {
                        oldMateriaPrimaOfMateriaPrimaArticuloListNewMateriaPrimaArticulo.getMateriaPrimaArticuloList().remove(materiaPrimaArticuloListNewMateriaPrimaArticulo);
                        oldMateriaPrimaOfMateriaPrimaArticuloListNewMateriaPrimaArticulo = em.merge(oldMateriaPrimaOfMateriaPrimaArticuloListNewMateriaPrimaArticulo);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = materiaPrima.getNmid();
                if (findMateriaPrima(id) == null) {
                    throw new NonexistentEntityException("The materiaPrima with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            MateriaPrima materiaPrima;
            try {
                materiaPrima = em.getReference(MateriaPrima.class, id);
                materiaPrima.getNmid();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The materiaPrima with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<MateriaPrimaArticulo> materiaPrimaArticuloListOrphanCheck = materiaPrima.getMateriaPrimaArticuloList();
            for (MateriaPrimaArticulo materiaPrimaArticuloListOrphanCheckMateriaPrimaArticulo : materiaPrimaArticuloListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This MateriaPrima (" + materiaPrima + ") cannot be destroyed since the MateriaPrimaArticulo " + materiaPrimaArticuloListOrphanCheckMateriaPrimaArticulo + " in its materiaPrimaArticuloList field has a non-nullable materiaPrima field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(materiaPrima);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<MateriaPrima> findMateriaPrimaEntities() {
        return findMateriaPrimaEntities(true, -1, -1);
    }

    public List<MateriaPrima> findMateriaPrimaEntities(int maxResults, int firstResult) {
        return findMateriaPrimaEntities(false, maxResults, firstResult);
    }

    private List<MateriaPrima> findMateriaPrimaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(MateriaPrima.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public MateriaPrima findMateriaPrima(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(MateriaPrima.class, id);
        } finally {
            em.close();
        }
    }

    public int getMateriaPrimaCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<MateriaPrima> rt = cq.from(MateriaPrima.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

    public List<MateriaPrima> getMateriaPrimaList(String codigo, String descripcion) {
        EntityManager em = getEntityManager();
        try {
            StringBuilder sb = new StringBuilder("SELECT materiaPrima FROM MateriaPrima materiaPrima WHERE 1=1 ");
            if (codigo != null) {
                sb.append("AND (materiaPrima.nmid = :NMID ");
                if (descripcion != null) {
                    sb.append("AND materiaPrima.dsdescripcion LIKE :DSDESCRIPCION");
                }
                sb.append(")");
            } else if (descripcion != null) {
                sb.append("AND materiaPrima.dsdescripcion LIKE :DSDESCRIPCION");
            }

            Query query = em.createQuery(sb.toString());
            if (codigo != null) {
                query.setParameter("NMID", Integer.parseInt(codigo));
            }
            if (descripcion != null) {
                query.setParameter("DSDESCRIPCION", "%" + descripcion + "%");
            }

            List<MateriaPrima> materiasPrima = query.getResultList();
            return materiasPrima;
        } finally {
            em.close();
        }
    }
}
